package cn.xxi.ai.workflow.core.node;

import cn.xxi.ai.util.JsonUtil;
import cn.xxi.ai.workflow.state.State;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import dev.langchain4j.model.input.PromptTemplate;

import java.util.Map;

@JsonTypeInfo(use = JsonTypeInfo.Id.SIMPLE_NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    // 手动注册所有子类，例如：
    //@JsonSubTypes.Type(value = LlmNode.class, name = "LlmNode")
})
public abstract class Node<T extends NodeData> {

    public abstract String getId();
    public abstract T getData();
    public abstract Position getPosition();
    public abstract Style getStyle();

    /**
     * 解析模板字符串中的变量，使用 State 中的数据进行替换
     *
     * @param input  待解析的模板字符串，支持变量表达式
     * @param state  当前节点的状态数据
     * @return 变量替换后的字符串结果
     */
    public String parseVariable(String input, State state) {
        if (input == null || input.isBlank()) {
            return input;
        }

        // 将 State 的 JSON 字符串转换为 Map
        Map<String, Object> originalMap = JsonUtil.toMap(state.json());

        // 对 Map 进行扁平化处理，方便模板变量替换
        Map<String, Object> flatMap = JsonUtil.flattenMap(originalMap);

        // 移除值为 null 的条目，避免替换时出现异常
        flatMap.entrySet().removeIf(e -> e.getValue() == null);

        // 使用 langchain4j 的 PromptTemplate 进行变量替换
        PromptTemplate template = new PromptTemplate(input);

        return template.apply(flatMap).text();
    }
}